全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据! |
您所在的位置:网站首页 › 训练 日文 › 全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据! |
全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据!1.简介目标:基于pytorch、transformers做中文领域的nlp开箱即用的训练框架,提供全套的训练、微调模型(包括大模型、文本转向量、文本生成、多模态等模型)的解决方案;数据: 从开源社区,整理了海量的训练数据,帮助用户可以快速上手;同时也开放训练数据模版,可以快速处理垂直领域数据;结合多线程、内存映射等更高效的数据处理方式,即使需要处理百GB规模的数据,也是轻而易举;流程:每一个项目有完整的模型训练步骤,如:数据清洗、数据处理、模型构建、模型训练、模型部署、模型图解;模型:当前已经支持gpt2、clip、gpt-neox、dolly、llama、chatglm-6b、VisionEncoderDecoderModel等多模态大模型;多卡串联
:当前,多数的大模型的尺寸已经远远大于单个消费级显卡的显存,需要将多个显卡串联,才能训练大模型、才能部署大模型。因此对部分模型结构进行修改,实现了训练时、推理时
的多卡串联功能。模型训练 中文名称 文件夹名称 数据 数据清洗 大模型 模型部署 图解 中文文本分类 chinese_classifier ✅ ✅ ✅ ❌ ✅ 中文gpt2 chinese_gpt2 ✅ ✅ ✅ ✅ ❌ 中文clip chinese_clip ✅ ✅ ✅ ❌ ✅ 图像生成中文文本 VisionEncoderDecoderModel ✅ ✅ ✅ ❌ ✅ vit核心源码介绍 vit model ❌ ❌ ❌ ❌ ✅ Thu-ChatGlm-6b(v1) simple_thu_chatglm6b ✅ ✅ ✅ ✅ ❌ 🌟chatglm-v2-6b🎉 chatglm_v2_6b_lora ✅ ✅ ✅ ❌ ❌ 中文dolly_v2_3b dolly_v2_3b ✅ ✅ ✅ ❌ ❌ 中文llama chinese_llama ✅ ✅ ✅ ❌ ❌ 中文bloom chinese_bloom ✅ ✅ ✅ ❌ ❌ 中文falcon(注意:falcon模型和bloom结构类似) chinese_bloom ✅ ✅ ✅ ❌ ❌ 中文预训练代码 model_clm ✅ ✅ ✅ ❌ ❌ 百川大模型 model_baichuan ✅ ✅ ✅ ✅ ❌ 模型修剪✂️ model_modify ✅ ✅ ✅ llama2 流水线并行 pipeline ✅ ✅ ✅ ❌ ❌ 2.文本分类模型本部分,介绍中文的文本分类模型,适用于二分类、多分类等情况。使用transformers库。 处理数据code_01_processdata.ipynb数据介绍 本案例使用的是一个外卖平台的评论数据,对评论的文本做了分类(分为好评和差评)当你把code_01_processdata.ipynb文件跑完之后,就可以看到在📁data_all里面有一个📁data,里面有三个文件,样式都是像下面👇这样的![]() 上图是一个batch的数据,或者所有的文本分类的数据样式: text下面的红色条,就是一个个句子。label里面有红色有绿色,就是表示标签分类。transformers包做分类的时候,数据要求就这两列。注意点: 数据需要分为train_data.csv,test_data.csv,valid_data.csv,这三个csv文件注意是使用,分割开的。数据不可以有缺失值数据最好只含有两列:label,textlabel:表示标签,最好为整型数值。0,1,2,3,4等text:表示文本,(看你需求,可以有符号,也可以没有标点符号)train_data.csv,test_data.csv,valid_data.csv这三个数据里面,不要有数据相同的,不然会造成数据泄漏。训练模型code_02_trainmodel.ipynb![]() ![]() ![]() ![]() 需要准备好环境,也就是安装需要的包 代码语言:javascript复制pip install -r requirements.txt像是pytorch这种基础的包肯定也是要安装的,就不提了。 数据来源 获得数据:数据链接,关注公众号【统计学人】,然后回复【gpt2】即可获得。获得我训练好的模型(使用了15GB的数据(31亿个tokens),在一张3090上,训练了60多小时) 数据格式 数据其实就是一系列文件夹📁,然后每一个文件夹里面有大量的文件,每一个文件都是.csv格式的文件。其中有一列数据是content每一行的content就代表一句话虽然数据有15GB那么大,但是处理起来一点也不复杂,使用 datasets 包,可以很轻松的处理大数据,而我只需要传递所有的文件路径即可,这个使用 glob 包就能完成。 训练代码train_chinese_gpt2.ipynb 现在训练一个gpt2代码,其实很简单的。抛开处理数据问题,技术上就三点:tokenizer、gpt2_model、Trainertokenizer使用的是bert-base-chinese ,然后再添加一下bos_token、eos_token、pad_token。gpt2_model使用的是gpt2,这里的gpt2我是从0开始训练的。而不是使用别人的预训练的gpt2模型。Trainer训练器使用的就是transformers的Trainer模块。(支撑多卡并行,tensorboard等,都写好的,直接调用就行了,非常好用) 模型 推理代码infer.ipynb这个是chinese-gpt2的推理代码 将代码中的model_name_or_path = "checkpoint-36000"里面的"checkpoint-36000",修改为模型所在的路径。然后运行下面一个代码块,即可输出文本生成结果可以参考这个代码,制作一个api,或者打包成一个函数或者类。交互机器人界面chatbot.py修改代码里面的第4行,这一行值为模型所在的位置,修改为我分享的模型文件路径。代码语言:javascript复制model_name_or_path = "checkpoint-36000"运行代码语言:javascript复制python chatbot.py点击链接,即可在浏览器中打开机器人对话界面更多这个完整的项目下来,其实我都是全靠huggingface文档、教程度过来的.我做的东西,也就是把Tokenizer改成中文的了,然后也整理了数据,别的大部分东西,都不是我做的了.原文链接为https://huggingface.co/course/zh-CN/chapter7/6?fw=pt.其实,我更喜欢做应用,但是也要理解相关的背后原理,目前还在研究相关的gpt2原理还有相关的推理细节,这是我整理的链接,希望可以共同进步 https://huggingface.co/blog/how-to-generatehttps://huggingface.co/gpt2https://huggingface.co/gpt2-large4.中文clip模型本文将介绍,如何从0到1的训练一个中文clip模型。在处理数据的过程中,训练的过程中,需要的注意事项。从数据流的角度,看看clip模型是怎么处理数据的,模型是怎么构建的。image和text的模型的差异性,两个模型是怎么合并起来计算loss的。clip模型介绍CLIP的英文全称是Contrastive Language-Image Pre-training,即一种基于对比文本-图像对的预训练方法或者模型。 CLIP是一种基于对比学习的多模态模型,与CV中的一些对比学习方法如moco和simclr不同的是, CLIP的训练数据是文本-图像对:一张图像和它对应的文本描述,这里希望通过对比学习, 模型能够学习到文本-图像对的匹配关系。 如下图所示,CLIP包括两个模型: Text Encoder和Image Encoder,其中Text Encoder用来提取文本的特征,可以采用NLP中常用的text transformer模型; Image Encoder用来提取图像的特征,可以采用常用CNN模型或者vision transformer。![]() 上面这段文字来源于https://zhuanlan.zhihu.com/p/493489688 从数据上看:之前相似度计算,都是两个文本对:text - text。只不过现在都是text - image了。clip是两个模型(具体长什么样子,后面再说)2.1 text-model:负责把text转换成向量。2.2 image-model:负责把image转换成向量。2.3 然后把上面两个向量,做交叉计算loss,然后loss反向传播,这样两个模型的参数都会更新。其实你想啊,这个image-model处理图像的,其实也可以改为处理视频、处理3d模型等。那简直是格局打开🫴了。我现在没有数据,后面也打算做一个。你再想想,text-image => text-image-video-3d这样联合起来,是不是更好。没数据,没机器,做不了。有些人可能感觉,你这人,就知道TMD吹牛,来来来,我带你研究研究clip模型的源码。数据直接点击链接https://pan.baidu.com/s/1wGmXUNP021OWnW7Kik7q1A?pwd=gd3c 来获得。把下载好的文件,也就是test-2.6w.csv、train-137w.csv放在文件夹📁bigdata/raw_data里面。以此运行processdta_01.ipynb、processdta_02.ipynb、processdta_02.ipynb用来处理数据。3.1 processdta_01.ipynb:用来下载数据,大概下载了10多个小时。3.2 processdta_02.ipynb:用来筛选数据,不是所有的图片数据都是可以用的,这一步非常坑。需要留意。如果图片没有筛选好,在你训练到中间的时候,突然一下因为图片无法加载导致错误,从而训练中断了。3.3 processdta_03.ipynb:用来把数据干净的数据处理好,合并好,生成新的,漂亮的训练数据。其实完整下来看,数据清洗,就是把符合格式的照片筛选出来,然后进行训练。数据总结说到底,你的数据只要整理成这样的一个样式即可 text image_path 河南一村民继承祖上的一金碗,专家鉴定:此碗是溥仪皇帝用过的 bigdata/image_data/test-9282.jpg 著名钢琴家郎朗:我永远不会放弃演奏 bigdata/image_data/test-2644.jpg 科幻动作电影《超体》10月24日来袭 bigdata/image_data/test-13199.jpg text:这一列对应图片的标注,或者和图片相关的文本。image_path:这一列对应图片所在你电脑本地上的路径。是的,搞了半天,数据就是这么简单。数据预处理这里的数据预处理,是我随便起的名字。说白了,就是这么会是: 使用tokenizer把text转换成input_ids和attention_mask. 使用processor把image转换成pixel_values. 处理text,那还是很快的。百万级别的数据,可能2~3分钟就行了。 因为image太大了,只能在训练的时候,每一batch,才能去加载image ,这就导致训练的时候特别慢。倒不是因为我的3090算力不行,全都TMD卡在计算机IO上了,非常让人难受。 模型部分终于讲解到clip的模型部分了。这个clip模型实在是太灵活了,你可以做很多个版本,这里我们挑几个比较常见的结构,来分享一下。 常见的clip模型这里值得是常见的clip模型,特指的是transformers包的clip模型。 clip主要就是分为两个部分,一个是CLIPTextTransformer,一个是CLIPVisionTransformer,说白了就是一个处理text,一个处理image。CLIPTextTransformer和CLIPVisionTransformer的核心,都共用了一个模型结构CLIPEncoder 。也就是CLIP编码部分。(这里说的共用,值得是模型框架相同,而不是模型训练的时候,参数也相同。)Q:有些人就问了,text和image两个生成的数据都不一样,比如text转换成input_ids和attention_mask;image 转换成pixel_values;他们怎么可以使用一个模型结构CLIPEncoder? A:这个也是非常好回答的,因他俩又不是直接使用CLIPEncoder ,前后都加了一些万金油的模型组件(比如embedding、linear 等),模型输出的时候,也是这么做的。还是应了那句话,就看你怎么吧数据转换成hidden_states,以及怎么把hidden_states输出出去。 Q:CLIPTextTransformer和CLIPVisionTransformer输出的维度也不一定一样吧,怎么计算交叉损失? A: 也很简单啦,加个linear对齐一下就行了。 看看CLIPTextTransformer和CLIPVisionTransformer的内心: ![]() ![]() 上面的常见的clip模型,确实是好,其实你只要换一个支持中文的新tokenizer,然后从0️⃣开始训练即可。 但是这么搞,没什么创意呀。其实我第一次就是这么干的,直接支持中文的新tokenizer。但是训练了一天,loss基本上没变化。我内心其实是崩溃的。 后来,我研究了一下transformers包里面的chinese-clip模型代码。我发现,chinese-clip相对于clip 。就是把常规的CLIPTextTransformer换成了bert版本的。啊对,这就破案了。这个奉上代码截图。 ![]() ![]() 之前在huggingfacehttps://huggingface.co/nlpconnect/vit-gpt2-image-captioning上看到这个模型. 感觉这个模型很有趣,想法很好。发现这个模型关于中文的不多。之前的clip训练其实挺失败的,loss没有下降.主要也就是抱着学习的态度,把源码看懂,把流程跑通。分享中间的细节和踩坑经历。 ![]() 目前已经把训练好的模型,发布在huggingface上了。https://huggingface.co/yuanzhoulvpi/vit-gpt2-image-chinese-captioning 本模块处理数据的方式和clip模型差不多,可以看隔壁文件夹,训练clip的数据处理思路。 只要把processdta_02.ipynb文件替换即可。执行顺序依然按照着processdta_01.ipynb、processdta_02.ipynb、processdta_03.ipynb。 训练部分train_encoder_decoder.ipynb 处理图像,使用的是"google/vit-base-patch16-224"模型。处理文本,使用的是"yuanzhoulvpi/gpt2_chinese"模型。最后就是把两个模型通过VisionEncoderDecoderModel粘起来。 训练的loss![]() ![]() ![]() vit想法非常牛,但是数据处理的思想更牛,之前都没提出来过。 载对于一个图片,将一个图片分割成N块。巧妙的使用nn.Conv2d。 初始化代码语言:javascript复制import torch from torch import nn #base parameter image_size=224 # 图片的width和height patch_size=16 # 将图片的分为块,每一块的大小为16x16,这样就有(224//16)^2 = 14 ^2 = 196个 num_channels=3 # R,G, B hidden_size=768 # 输出的hidden_size batch_size = 16 # 一批数据有多少创建一个分块器和一个样本数据(一个batch)代码语言:javascript复制#分块器 project = nn.Conv2d(num_channels, hidden_size, kernel_size=patch_size, stride=patch_size) #样本数据(一个`batch`) #batch_size, num_channels, height, width = pixel_values.shape pixel_values = torch.randn(batch_size, num_channels, image_size, image_size) pixel_values.shape 输出分块的大小代码语言:javascript复制project(pixel_values).shape #> torch.Size([16, 768, 14, 14])数据再转换一下,image的embedding就完成了。代码语言:javascript复制image_embedding = project(pixel_values).flatten(2).transpose(1, 2) image_embedding.shape #> torch.Size([16, 196, 768]) # batch_size, seq_length, embedding_dim这个时候,就已经和文本的数据一样了。维度都是(batch_size, seq_length, embedding_dim),再向下推导,就是transformers了。没什么可介绍的了。 项目链接:https://github.com/yuanzhoulvpi2017/zero_nlp 更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |